cpp 函数
-
笨拙的重复函数
-
函数指针
让“函数”变成变量,让行为“数据化”
#include <iostream>
int contMatchElements(int *beg, int *end, bool(*pred)(const int &)){
int result = 0;
for(;beg!=end;++beg){
if(pred(*beg)) ++result;
}
return result;
}
bool isGreater20(const int &val){ return val > 20;}
bool isGreater25(const int &val){ return val > 25;}
bool isLess10(const int &val){ return val < 10;}
int main(){
int intArray[] = {11,16,21,19,17,30};
ans = countMatchElements(intArray, intArray + 6, isGreater20);
ans = countMatchElements(intArray, intArray + 6, isGreater25);
ans = countMatchElements(intArray, intArray + 6, isLess10);
}
- 通过模板提高函数通用性
独立于类型的函数,可产生函数特定类型的版本
#include <iostream>
template<typename T>
int contMatchElements(T *beg, T *end, bool(*pred)(const T &)){
int result = 0;
for(;beg!=end;++beg){
if(pred(*beg*)) ++result;
}
return result;
}
bool isGreater20(const int &val){ return val > 20;}
bool isGreater25(const int &val){ return val > 25;}
bool isLess10(const int &val){ return val < 10;}
bool isTinyStr(const std::string &val){return val.size() <=3; }
int main(){
int intArray[] = {11,16,21,19,17,30};
std::string strArray[]={'aaaa','bbb','c','ddddddd','ffff','gg'}
bool ans = countMatchElements(intArray, intArray + 6, isGreater20);
bool ans = countMatchElements(intArray, intArray + 6, isGreater25);
bool ans = countMatchElements(intArray, intArray + 6, isLess10);
bool ans = countMatchElements(strArray, strArray + 6, isTinyStr);
}
- 仿函数(函数对象)
定义了调用操作符
行为类似函数的对象
#include <iostream>
template<typename T, typename Pred>
int contMatchElements(T *beg, T *end, Pred pred){
int result = 0;
for(;beg!=end;++beg){
if(pred(*beg*)) ++result;
}
return result;
}
template<typename T>
struct Greater{
T mVal; //持有的状态
explicit Greater(T value): mVal(value){}//构造函数初始化mval
bool operator()(const T &val) const{ return val> mVal;}//重载函数调用操作符
}
int main(){
int intArray[] = {11,16,21,19,17,30};
std::string strArray[]={'aaaa','bbb','c','ddddddd','ffff','gg'}
Greater<int> greater20{20};
Greater<std::string> longStr3{3};
bool ans = countMatchElements(intArray, intArray + 6, greater20);
bool ans = countMatchElements(strArray, strArray + 6, longStr3);
}
- lambda表达式——更加简洁
#include <iostream>
template<typename T, typename Pred>
int contMatchElements(T *beg, T *end, Pred pred){
int result = 0;
for(;beg!=end;++beg){
if(pred(*beg)) ++result;
}
return result;
}
int main(){
int intArray[] = {11,16,21,19,17,30};
std::string strArray[]={'aaaa','bbb','c','ddddddd','ffff','gg'}
auto greater20 = [](auto &val) -> bool {return val > 20;};
auto isTinyStr = [](auto &val) -> bool {return val <=3;};
bool ans = countMatchElements(intArray, intArray + 6, greater20);
bool ans = countMatchElements(strArray, strArray + 6, isTinyStr);
}